package dome5Steam;


/*
Stream流确实只能使用一次。Stream流属于管道流，其设计原理决定了它的单次使用特性。
具体来说，当第一个Stream流调用完方法后，数据就会流转到下一个Stream上，
而这时第一个Stream流就已经使用完毕并被关闭，因此无法再调用方法。如果尝试再次使用已经关闭的Stream流，
将会抛出IllegalStateException异常，
提示“stream has already been operated upon or closed”（流已经被操作或关闭）
 */
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Streamdome3 {
    //目标：认识Stream流的常用方法，筛选和匹配
    //对流上数据处理，返回新流，支持链式编程
    public static void main(String[] args) {
        List<String> list=new ArrayList<>();
        list.add("张三分");
        list.add("张敏");
        list.add("八宝粥");
        list.add("张无忌");
        list.add("陈世玉");
        list.add("张家聪");
        //1.过滤方法
        List<String> newlist=list.stream().filter(s -> s.startsWith("张") && s.length()==3).collect(Collectors.toList());
        System.out.println(newlist);
        List<Double> list2=new ArrayList<>();
        list2.add(3.14);
        list2.add(3.14);
        list2.add(99.6);
        list2.add(4.58);
        list2.stream().sorted().forEach(System.out::println);//升序
        System.out.println("==============");
        list2.stream().sorted((o1,o2)->-o1.compareTo(o2)).forEach(System.out::println);//降序,自定义排序规则
        System.out.println("==============");
        list2.stream().sorted((o1,o2)->-o1.compareTo(o2)).limit(2).forEach(System.out::println);//降序只要前两名
        System.out.println("==============");
        list2.stream().sorted((o1,o2)->-o1.compareTo(o2)).skip(2).forEach(System.out::println);//降序跳过前两名
        System.out.println("==============");
        //如果希望自定义排序规则，并且要自动去重，那么需要重写hashCode和equals方法
        list2.stream().sorted((o1,o2)->-o1.compareTo(o2)).distinct().forEach(System.out::println);//降序自动去重
        //加工方法也叫也叫映射方法；把流上原来数据转换为另外一种数据，并放回去
        list2.stream().map(s->"加十分后:"+(s+10)).forEach(System.out::println);
        System.out.println("==============");
        //合并流方法
        Stream<String> s1 = Stream.of("张无忌","张三丰","张翠山","张天师","张无忌");
        Stream<Integer> s2 = Stream.of(123,456,789);
        Stream<Object> s3= Stream.concat(s1,s2);
        System.out.println(s3.count());
//        s3.forEach(System.out::println);

    }
}
